home *** CD-ROM | disk | FTP | other *** search
/ CU Amiga Super CD-ROM 23 / CU Amiga - Super CD-ROM 23 (June 1998).iso / CreatingGames / Utilities / C / GBDK / lib / terminal.s < prev   
Encoding:
Text File  |  1996-04-16  |  12.2 KB  |  882 lines

  1.     .include    "lib/global.h"
  2.  
  3.     .MAXCURSPOSX    = 0x13    ; In tiles
  4.     .MAXCURSPOSY    = 0x11
  5.  
  6.     .MINMSPOSX    = 0x02    ; In tiles
  7.     .MINMSPOSY    = 0x0A
  8.     .MAXMSPOSX    = 0x11
  9.     .MAXMSPOSY    = 0x0F
  10.     .INIMSPOSX    = .MINMSPOSX
  11.     .INIMSPOSY    = .MINMSPOSY
  12.  
  13.     .MSOFFSETX    = 0x0C    ; In pixels
  14.     .MSOFFSETY    = 0x14
  15.  
  16.     .MINACCEL    = 0x0800
  17.     .MAXACCEL    = 0x0100
  18.  
  19.     .KBDWINPOSY    = 0x08    ; In tiles
  20.     .SCROLLSPD    = 0x0100
  21.     .KBDSIZE    = 0x1006; In tiles (0x10 x 0x06)
  22.  
  23.     .BUFLEN        = 0x20
  24.  
  25.     .SPACE        = 0x20
  26.     .BS        = 0x08
  27.     .CR        = 0x0A    ; Unix
  28. ;    .CR        = 0x0D    ; Dos
  29.  
  30.     .area    HEADER    (ABS)
  31.  
  32.     .org    .MODE_TABLE+4*.T_MODE
  33.     JP    .tmode
  34.  
  35.     .module    Terminal
  36.  
  37.     .area    _BSS
  38.  
  39. .curx:
  40.     .ds    0x01
  41. .cury:
  42.     .ds    0x01
  43. .msx:
  44.     .ds    0x01
  45. .msy:
  46.     .ds    0x01
  47. .msacc:
  48.     .ds    0x02
  49. .msstate:
  50.     .ds    0x01
  51. .mschanged:
  52.     .ds    0x01
  53. .string_len:
  54.     .ds    0x01
  55. .input_buffer:
  56.     .ds    .BUFLEN
  57.  
  58.     .area    _CODE
  59.  
  60.     ; Enter text mode
  61. .tmode::
  62.     LD    A,#.T_MODE
  63.     LD    (.mode),A
  64.  
  65.     CALL    .wait_vbl    ; Must be in VBL before turning the screen off.
  66.  
  67.     LD    A,#0b01000001    ; LCD        = Off (no picture on screen)
  68.     LDH    (.LCDCONT),A
  69.                 ; WindowBank    =    0x9C00
  70.                 ; Window    =    Off
  71.                 ; BG Chr    =    0x8800
  72.                 ; BG Bank    =    0x9800
  73.                 ; OBJ        =    8x8
  74.                 ; OBJ        =    Off
  75.                 ; BG        =    On
  76.  
  77.     CALL    .std_pal    ; Normal palette
  78.  
  79.     LD    BC,#.tp1
  80.     LD    HL,#0x8000
  81.     LD    DE,#.endtp1-.tp1
  82.     CALL    .mv_tiles    ; Move tiles
  83.  
  84.     LD    BC,#.tp3
  85.     LD    HL,#0x8800
  86.     LD    DE,#.endtp3-.tp3
  87.     CALL    .mv_tiles    ; Move tiles
  88.  
  89.     LD    BC,#.tp2
  90.     LD    HL,#0x9000
  91.     LD    DE,#.endtp2-.tp2
  92.     CALL    .mv_tiles    ; Move tiles
  93.  
  94.     XOR    A        ; A = 0
  95.     LD    (.curx),A
  96.     LD    (.cury),A
  97.     LD    A,#<.MINACCEL    ; Acceleration
  98.     LD    (.msacc),A
  99.     LD    A,#>.MINACCEL
  100.     LD    (.msacc+1),A
  101.  
  102.     ; Initialize window
  103.     LD    BC,#.frame_tiles
  104.     LD    DE,#0x0000    ; Place image at (0x00,0x00) tiles
  105.     LD    HL,#0x140A    ; Image size is 0x14 x 0x0A tiles
  106.     CALL    .set_xy_wtt
  107.     LD    BC,#.kbdtable
  108.     LD    DE,#0x0202    ; Place image at (0x02,0x02) tiles
  109.     LD    HL,#.KBDSIZE    ; Image size is 0x10 x 0x06 tiles
  110.     CALL    .set_xy_wtt
  111.     XOR    A        ; A = 0
  112.     LD    A,#.MINWNDPOSX
  113.     LDH    (.WNDPOSX),A
  114.     LD    A,#.MAXWNDPOSY    ; Hide window
  115.     LDH    (.WNDPOSY),A
  116.  
  117.     ; Initialize sprite
  118.     XOR    A        ; A = 0
  119.     LD    C,#0x00        ; Sprite 0x00
  120.     LD    D,#0x00        ; Default sprite properties
  121.     CALL    .prop_sprite
  122.     LD    C,#0x00        ; Sprite 0x00
  123.     LD    D,#0x00        ; Tile 0x00
  124.     CALL    .set_sprite
  125.     LD    A,#0b00101100
  126.     LDH    (.SPR0PAL),A
  127.  
  128.     ; Clear screen
  129.     CALL    .cls
  130.  
  131.     LD    A,#0b11000001    ; LCD Controller = On
  132.     LDH    (.LCDCONT),A
  133.     EI            ; Enable interrupts
  134.  
  135.     RET
  136.  
  137.     ; Prompt the user for a char and return it in A
  138. .get_char:
  139.     PUSH    BC
  140.     PUSH    DE
  141.     PUSH    HL
  142.     CALL    .show_kbd
  143.     CALL    .show_mouse
  144. 1$:
  145.     CALL    .track_mouse
  146.     CALL    .update_mouse
  147.     CALL    .jpad
  148.     LD    D,A
  149.     AND    #.A        ; Is A pressed ?
  150.     JP    Z,1$
  151.  
  152.     LD    A,(.msy)    ; Look for char under the mouse
  153.     SUB    #.MINMSPOSY
  154.     JR    Z,12$
  155.     LD    E,A
  156.     XOR    A        ; A = 0
  157. 11$:
  158.     ADD    #.MAXMSPOSX-.MINMSPOSX+1
  159.     DEC    E
  160.     JR    NZ,11$
  161. 12$:
  162.     LD    E,A
  163.     LD    A,(.msx)
  164.     SUB    #.MINMSPOSX
  165.     ADD    E
  166.     LD    HL,#.kbdtable
  167.     LD    B,#0x00
  168.     LD    C,A
  169.     ADD    HL,BC
  170.     LD    B,(HL)
  171.  
  172.     CALL    .hide_mouse
  173.     CALL    .hide_kbd
  174.     LD    A,B
  175.  
  176.     POP    HL
  177.     POP    DE
  178.     POP    BC
  179.     RET
  180.  
  181.     ; Prompt the user for a string and store it in the
  182.     ; address pointed by HL
  183. .get_string:
  184.     PUSH    BC
  185.     PUSH    DE
  186.     PUSH    HL
  187.     CALL    .show_kbd
  188.     CALL    .show_bkg
  189.     CALL    .show_mouse
  190.     XOR    A        ; A = 0
  191.     LD    (.string_len),A
  192. 1$:
  193.     CALL    .track_mouse
  194.     CALL    .update_mouse
  195.     CALL    .jpad
  196.     LD    D,A
  197.     AND    #.A        ; Is A pressed ?
  198.     JP    NZ,10$
  199.     LD    A,D
  200.     AND    #.B        ; Is B pressed ?
  201.     JP    NZ,20$
  202.     LD    A,D
  203.     AND    #.SELECT    ; Is SELECT pressed ?
  204.     JP    NZ,30$
  205.     LD    A,D
  206.     AND    #.START        ; Is START pressed ?
  207.     JR    Z,1$
  208.     CALL    .padup        ; Wait for button to be depressed
  209.  
  210.     LD    A,#.CR
  211.     CALL    .put_char
  212.     LD    (HL),#0x00
  213.     CALL    .hide_mouse
  214.     CALL    .hide_bkg
  215.     CALL    .hide_kbd
  216.     POP    HL
  217.     POP    DE
  218.     POP    BC
  219.     RET
  220.  
  221. 10$:
  222.     ; Insert a character at cursor position
  223.     LD    A,(.string_len)    ; Check buffer length
  224. ;    CP    #.BUFLEN-1    ; Keep 1 char for EOS
  225. ;    JR    Z,13$
  226.     INC    A
  227.     LD    (.string_len),A    ; Update it
  228.     LD    A,(.msy)    ; Look for char under the mouse
  229.     SUB    #.MINMSPOSY
  230.     JR    Z,12$
  231.     LD    E,A
  232.     XOR    A        ; A = 0
  233. 11$:
  234.     ADD    #.MAXMSPOSX-.MINMSPOSX+1
  235.     DEC    E
  236.     JR    NZ,11$
  237. 12$:
  238.     LD    E,A
  239.     LD    A,(.msx)
  240.     SUB    #.MINMSPOSX
  241.     ADD    E
  242.     PUSH    HL
  243.     LD    HL,#.kbdtable
  244.     LD    B,#0x00
  245.     LD    C,A
  246.     ADD    HL,BC
  247.     LD    A,(HL)
  248.     POP    HL
  249.     LD    (HL+),A        ; Add it into input buffer
  250.     CALL    .put_char    ; Print it
  251.     CALL    .show_bkg    ; Ensure the text is not hidden
  252. 13$:
  253.     CALL    .padup        ; Wait for button to be depressed
  254.     JP    1$
  255.  
  256. 20$:
  257.     ; Delete a character at cursor position
  258.     LD    A,(.string_len)    ; Is there any char in the buffer ?
  259.     OR    A
  260.     JR    Z,21$
  261.     DEC    A        ; Yes
  262.     LD    (.string_len),A    ; Update buffer length
  263.     DEC    HL
  264.     CALL    .del_char
  265. 21$:
  266.     CALL    .padup        ; Wait for button to be depressed
  267.     JP    1$
  268.  
  269. 30$:
  270.     CALL    .hide_mouse
  271.     CALL    .hide_bkg
  272.     CALL    .hide_kbd
  273.     CALL    .padup        ; Wait for button to be depressed
  274.     CALL    .show_kbd
  275.     CALL    .show_bkg
  276.     CALL    .show_mouse
  277.     JP    1$
  278.  
  279. .show_kbd:
  280.     PUSH    BC
  281.     PUSH    DE
  282.     LDH    A,(.LCDCONT)
  283.     OR    #0b00100000    ; Window = On
  284.     LDH    (.LCDCONT),A
  285.     LD    A,#.MAXWNDPOSY    ; Show window
  286. 1$:
  287.     LDH    (.WNDPOSY),A
  288.     CP    #.KBDWINPOSY*0x08
  289.     JR    Z,99$
  290.     DEC    A
  291.     LD    D,A
  292.     LD    BC,#.SCROLLSPD
  293.     CALL    .delay_ns
  294.     LD    A,D
  295.     JR    1$
  296. 99$:
  297.     POP    DE
  298.     POP    BC
  299.     RET
  300.  
  301. .hide_kbd:
  302.     PUSH    BC
  303.     PUSH    DE
  304.     LD    A,#.KBDWINPOSY*0x08+1
  305. 1$:                ; Hide window
  306.     LDH    (.WNDPOSY),A
  307.     CP    #.MAXWNDPOSY
  308.     JR    Z,2$
  309.     INC    A
  310.     LD    D,A
  311.     LD    BC,#.SCROLLSPD
  312.     CALL    .delay_ns
  313.     LD    A,D
  314.     JR    1$
  315. 2$:
  316.     LDH    A,(.LCDCONT)
  317.     AND    A,#0b11011111    ; Window = Off
  318.     LDH    (.LCDCONT),A
  319.     POP    DE
  320.     POP    BC
  321.     RET
  322.  
  323. .show_bkg:
  324.     PUSH    BC
  325.     PUSH    DE
  326.     LDH    A,(.SCROLLY)
  327.     LD    D,A
  328.     LD    A,(.cury)
  329.     SUB    #.KBDWINPOSY-1
  330.     JR    C,99$
  331.     JR    Z,99$
  332.     SLA    A        ; A = A * 8
  333.     SLA    A
  334.     SLA    A
  335.     SUB    D
  336.     JR    C,99$
  337.     JR    Z,99$
  338.     LD    E,A
  339.     LDH    A,(.SCROLLY)
  340. 1$:
  341.     INC    A
  342.     LDH    (.SCROLLY),A
  343.     DEC    E
  344.     JR    Z,99$
  345.     LD    D,A
  346.     LD    BC,#.SCROLLSPD
  347.     CALL    .delay_ns
  348.     LD    A,D
  349.     JR    1$
  350. 99$:
  351.     POP    DE
  352.     POP    BC
  353.     RET
  354.  
  355. .hide_bkg:
  356.     LDH    A,(.SCROLLY)
  357.     OR    A
  358.     RET    Z
  359.     PUSH    BC
  360.     PUSH    DE
  361. 1$:
  362.     DEC    A
  363.     LDH    (.SCROLLY),A
  364.     JR    Z,99$
  365.     LD    D,A
  366.     LD    BC,#.SCROLLSPD
  367.     CALL    .delay_ns
  368.     LD    A,D
  369.     JR    1$
  370. 99$:
  371.     POP    DE
  372.     POP    BC
  373.     RET
  374.  
  375. .show_mouse:
  376.     LD    A,#.INIMSPOSX
  377.     LD    (.msx),A
  378.     LD    A,#.INIMSPOSY
  379.     LD    (.msy),A
  380.     CALL    .set_mouse
  381.     LDH    A,(.LCDCONT)
  382.     OR    #0b00000010    ; OBJ = On
  383.     LDH    (.LCDCONT),A
  384.     RET
  385.  
  386. .hide_mouse:
  387.     LDH    A,(.LCDCONT)
  388.     AND    #0b11111101    ; OBJ = Off
  389.     LDH    (.LCDCONT),A
  390.     RET
  391.  
  392. .track_mouse:
  393.     PUSH    BC
  394.     PUSH    DE
  395.     PUSH    HL
  396.     XOR    A        ; A = 0
  397.     LD    (.mschanged),A    ; Default to no change
  398.     CALL    .jpad
  399.     LD    D,A
  400.  
  401.     LD    HL,#.msstate
  402.     AND    #.UP+.DOWN+.LEFT+.RIGHT
  403.     JR    NZ,1$
  404.     LD    (HL),#0x00    ; Reset state
  405.     JP    99$
  406. 1$:
  407.     LD    A,(HL)
  408.     LD    (HL),#0x01    ; Set state
  409.     OR    A        ; Was it 0 ?
  410.     LD    HL,#.msacc    ; Acceleration
  411.     JR    NZ,2$
  412.                 ; Yes
  413.     LD    (HL),#<.MINACCEL
  414.     INC    HL
  415.     LD    (HL),#>.MINACCEL
  416.     JR    4$        ; Update position
  417. 2$:
  418.     LD    C,(HL)
  419.     INC    HL
  420.     LD    B,(HL)
  421.     DEC    BC
  422.     LD    A,B
  423.     OR    C
  424.     JR    Z,3$
  425.     LD    (HL),B
  426.     DEC    HL
  427.     LD    (HL),C
  428.     JP    99$
  429. 3$:                ; Set new acceleration to maximum
  430.     LD    (HL),#>.MAXACCEL
  431.     DEC    HL
  432.     LD    (HL),#<.MAXACCEL
  433. 4$:                ; Update position
  434.     LD    A,#0x01
  435.     LD    (.mschanged),A
  436.     LD    A,D
  437.     AND    #.UP        ; Is UP pressed ?
  438.     JR    Z,6$
  439.     LD    A,(.msy)
  440.     CP    #.MINMSPOSY
  441.     JR    Z,5$
  442.     DEC    A
  443.     LD    (.msy),A
  444.     JR    6$
  445. 5$:
  446.     LD    A,#.MAXMSPOSY
  447.     LD    (.msy),A
  448. 6$:
  449.     LD    A,D
  450.     AND    #.DOWN        ; Is DOWN pressed ?
  451.     JR    Z,8$
  452.     LD    A,(.msy)
  453.     CP    #.MAXMSPOSY
  454.     JR    Z,7$
  455.     INC    A
  456.     LD    (.msy),A
  457.     JR    8$
  458. 7$:
  459.     LD    A,#.MINMSPOSY
  460.     LD    (.msy),A
  461. 8$:
  462.     LD    A,D
  463.     AND    #.LEFT        ; Is LEFT pressed ?
  464.     JR    Z,10$
  465.     LD    A,(.msx)
  466.     CP    #.MINMSPOSX
  467.     JR    Z,9$
  468.     DEC    A
  469.     LD    (.msx),A
  470.     JR    10$
  471. 9$:
  472.     LD    A,#.MAXMSPOSX
  473.     LD    (.msx),A
  474. 10$:
  475.     LD    A,D
  476.     AND    #.RIGHT        ; Is RIGHT pressed ?
  477.     JR    Z,99$
  478.     LD    A,(.msx)
  479.     CP    #.MAXMSPOSX
  480.     JR    Z,11$
  481.     INC    A
  482.     LD    (.msx),A
  483.     JR    99$
  484. 11$:
  485.     LD    A,#.MINMSPOSX
  486.     LD    (.msx),A
  487. 99$:
  488.     POP    HL
  489.     POP    DE
  490.     POP    BC
  491.     RET
  492.  
  493. .update_mouse:
  494.     LD    A,(.mschanged)    ; Did it change ?
  495.     OR    A
  496.     RET    Z        ; No
  497. .set_mouse:
  498.     PUSH    BC
  499.     PUSH    DE
  500.     PUSH    HL
  501.     LD    C,#0x00        ; Sprite 0x00
  502.     LD    A,(.msx)
  503.     SLA    A        ; A = A * 8
  504.     SLA    A
  505.     SLA    A
  506.     ADD    #.MSOFFSETX
  507.     LD    D,A
  508.     LD    A,(.msy)
  509.     SLA    A        ; A = A * 8
  510.     SLA    A
  511.     SLA    A
  512.     ADD    #.MSOFFSETY
  513.     LD    E,A
  514.     CALL    .mv_sprite
  515.     POP    HL
  516.     POP    DE
  517.     POP    BC
  518.     RET
  519.  
  520.     ; Print a character without interpretation
  521. .out_char::
  522.     CALL    .set_char
  523.     CALL    .adv_curs
  524.     RET
  525.  
  526.     ; Print a character with interpretation
  527. .put_char::
  528.     CP    #.CR
  529.     JR    NZ,1$
  530.     CALL    .cr_curs
  531.     RET
  532. 1$:
  533.     CALL    .set_char
  534.     CALL    .adv_curs
  535.     RET
  536.  
  537.     ; Delete a character
  538. .del_char::
  539.     CALL    .rew_curs
  540.     LD    A,#.SPACE
  541.     CALL    .set_char
  542.     RET
  543.  
  544.     ; Print the character in A
  545. .set_char:
  546.     PUSH    BC
  547.     PUSH    DE
  548.     PUSH    HL
  549.     LD    E,A
  550.  
  551.     LD    A,(.cury)    ; y coordinate
  552.     LD    L,A
  553.     LD    H,#0x00
  554.     ADD    HL,HL
  555.     ADD    HL,HL
  556.     ADD    HL,HL
  557.     ADD    HL,HL
  558.     ADD    HL,HL
  559.     LD    A,(.curx)    ; x coordinate
  560.     LD    C,A
  561.     LD    B,#0x00
  562.     ADD    HL,BC
  563.     LD    BC,#0x9800
  564.     ADD    HL,BC
  565. 1$:
  566.     LDH    A,(.LCDSTAT)
  567.     AND    #0x02
  568.     JR    NZ,1$
  569.     LD    (HL),E
  570.     POP    HL
  571.     POP    DE
  572.     POP    BC
  573.     RET
  574.  
  575.     ; Move the cursor left
  576. .l_curs:
  577.     LD    A,(.curx)    ; x coordinate
  578.     CP    #0
  579.     RET    Z
  580.     DEC    A
  581.     LD    (.curx),A
  582.     RET
  583.  
  584.     ; Move the cursor right
  585. .r_curs:
  586.     LD    A,(.curx)    ; x coordinate
  587.     CP    #.MAXCURSPOSX
  588.     RET    Z
  589.     INC    A
  590.     LD    (.curx),A
  591.     RET
  592.  
  593.     ; Move the cursor up
  594. .u_curs:
  595.     LD    A,(.cury)    ; y coordinate
  596.     CP    #0
  597.     RET    Z
  598.     DEC    A
  599.     LD    (.cury),A
  600.     RET
  601.  
  602.     ; Move the cursor down
  603. .d_curs:
  604.     LD    A,(.cury)    ; y coordinate
  605.     CP    #.MAXCURSPOSY
  606.     RET    Z
  607.     INC    A
  608.     LD    (.cury),A
  609.     RET
  610.  
  611.     ; Advance the cursor
  612. .adv_curs::
  613.     PUSH    HL
  614.     LD    HL,#.curx    ; x coordinate
  615.     LD    A,#.MAXCURSPOSX
  616.     CP    (HL)
  617.     JR    Z,1$
  618.     INC    (HL)
  619.     JR    99$
  620. 1$:
  621.     LD    (HL),#0x00
  622.     LD    HL,#.cury    ; y coordinate
  623.     LD    A,#.MAXCURSPOSY
  624.     CP    (HL)
  625.     JR    Z,2$
  626.     INC    (HL)
  627.     JR    99$
  628. 2$:
  629.     CALL    .scroll
  630. 99$:
  631.     POP    HL
  632.     RET
  633.  
  634.     ; Rewind the cursor
  635. .rew_curs::
  636.     PUSH    HL
  637.     LD    HL,#.curx    ; x coordinate
  638.     XOR    A        ; A = 0
  639.     CP    (HL)
  640.     JR    Z,1$
  641.     DEC    (HL)
  642.     JR    99$
  643. 1$:
  644.     LD    (HL),#.MAXCURSPOSX
  645.     LD    HL,#.cury    ; y coordinate
  646.     XOR    A        ; A = 0
  647.     CP    (HL)
  648.     JR    Z,99$
  649.     DEC    (HL)
  650. 99$:
  651.     POP    HL
  652.     RET
  653.  
  654.     ; Advance the cursor to the next line
  655. .cr_curs::
  656.     PUSH    HL
  657.     XOR    A        ; A = 0
  658.     LD    (.curx),A
  659.     LD    HL,#.cury    ; y coordinate
  660.     LD    A,#.MAXCURSPOSY
  661.     CP    (HL)
  662.     JR    Z,2$
  663.     INC    (HL)
  664.     JR    99$
  665. 2$:
  666.     CALL    .scroll
  667. 99$:
  668.     POP    HL
  669.     RET
  670.  
  671.     ; Scroll the whole screen
  672. .scroll:
  673.     PUSH    BC
  674.     PUSH    DE
  675.     PUSH    HL
  676.     LD    HL,#0x9800
  677.     LD    BC,#0x9800+0x20    ; BC = next line
  678.     LD    E,#0x20-0x01    ; E = height - 1
  679. 1$:
  680.     LD    D,#0x20        ; D = width
  681. 2$:
  682.     LDH    A,(.LCDSTAT)
  683.     AND    #0x02
  684.     JR    NZ,2$
  685.  
  686.     LD    A,(BC)
  687.     LD    (HL+),A
  688.     INC    BC
  689.     DEC    D
  690.     JR    NZ,2$
  691.     DEC    E
  692.     JR    NZ,1$
  693.  
  694.     LD    D,#0x20
  695. 3$:
  696.     LDH    A,(.LCDSTAT)
  697.     AND    #0x02
  698.     JR    NZ,3$
  699.  
  700.     LD    A,#.SPACE
  701.     LD    (HL+),A
  702.     DEC    D
  703.     JR    NZ,3$
  704.     POP    HL
  705.     POP    DE
  706.     POP    BC
  707.     RET
  708.  
  709.     ; Clear the whole screen
  710. .cls:
  711.     PUSH    DE
  712.     PUSH    HL
  713.     LD    HL,#0x9800
  714.     LD    E,#0x20        ; E = height
  715. 1$:
  716.     LD    D,#0x20        ; D = width
  717. 2$:
  718.     LDH    A,(.LCDSTAT)
  719.     AND    #0x02
  720.     JR    NZ,2$
  721.  
  722.     LD    (HL),#.SPACE
  723.     INC    HL
  724.     DEC    D
  725.     JR    NZ,2$
  726.     DEC    E
  727.     JR    NZ,1$
  728.     POP    HL
  729.     POP    DE
  730.     RET
  731.  
  732. _gets::
  733.     LD    A,(.mode)
  734.     CP    #.T_MODE
  735.     JR    Z,1$
  736.     PUSH    BC
  737.     PUSH    DE
  738.     CALL    .tmode
  739.     POP    DE
  740.     POP    BC
  741. 1$:
  742.     LDA    HL,2(SP)
  743.     LD    A,(HL+)        ; first_tile
  744.     LD    H,(HL)
  745.     LD    L,A
  746.     PUSH    HL
  747.     CALL    .get_string
  748.     POP    HL
  749.     RET
  750.  
  751. _getchar::
  752.     LD    A,(.mode)
  753.     CP    #.T_MODE
  754.     JR    Z,1$
  755.     PUSH    BC
  756.     PUSH    DE
  757.     CALL    .tmode
  758.     POP    DE
  759.     POP    BC
  760. 1$:
  761.     CALL    .get_char
  762.     LD    H,#0x00
  763.     LD    L,A
  764.     RET
  765.  
  766. _putchar::
  767.     LD    A,(.mode)
  768.     CP    #.T_MODE
  769.     JR    Z,1$
  770.     PUSH    BC
  771.     PUSH    DE
  772.     CALL    .tmode
  773.     POP    DE
  774.     POP    BC
  775. 1$:
  776.     LDA    HL,2(SP)
  777.     LD    A,(HL)
  778.     CALL    .put_char
  779.     RET
  780.  
  781. _gotoxy::
  782.     LD    A,(.mode)
  783.     CP    #.T_MODE
  784.     JR    Z,1$
  785.     PUSH    BC
  786.     PUSH    DE
  787.     CALL    .tmode
  788.     POP    DE
  789.     POP    BC
  790. 1$:
  791.     LDA    HL,2(SP)
  792.     LD    A,(HL+)        ; x
  793.     LD    (.curx),A
  794.     INC    HL
  795.     LD    A,(HL+)        ; y
  796.     LD    (.cury),A
  797.     RET
  798.  
  799. _posx::
  800.     LD    A,(.mode)
  801.     CP    #.T_MODE
  802.     JR    Z,1$
  803.     PUSH    BC
  804.     PUSH    DE
  805.     CALL    .tmode
  806.     POP    DE
  807.     POP    BC
  808. 1$:
  809.     LD    H,#0x00
  810.     LD    A,(.curx)
  811.     LD    L,A
  812.     RET
  813.  
  814. _posy::
  815.     LD    A,(.mode)
  816.     CP    #.T_MODE
  817.     JR    Z,1$
  818.     PUSH    BC
  819.     PUSH    DE
  820.     CALL    .tmode
  821.     POP    DE
  822.     POP    BC
  823. 1$:
  824.     LD    H,#0x00
  825.     LD    A,(.cury)
  826.     LD    L,A
  827.     RET
  828.  
  829. _setchar::
  830.     LD    A,(.mode)
  831.     CP    #.T_MODE
  832.     JR    Z,1$
  833.     PUSH    BC
  834.     PUSH    DE
  835.     CALL    .tmode
  836.     POP    DE
  837.     POP    BC
  838. 1$:
  839.     LDA    HL,2(SP)
  840.     LD    A,(HL)
  841.     CALL    .set_char
  842.     RET
  843.  
  844.     .area    _DATA
  845.  
  846. .tp1:
  847.  
  848. .pointers:
  849.  
  850.     ; Tile 0x00
  851.     .byte    0xFF,0xFF,0xFE,0x82,0xFC,0x84,0xFC,0x84,0xFE,0x82,0xFF,0xB1,0xCF,0xC9,0x87,0x87
  852.  
  853. .endtp1:
  854.  
  855. .tp2:
  856.     .include    "lib/font_a.h"
  857. .endtp2:
  858.  
  859. .tp3:
  860.     .include    "lib/font_b.h"
  861. .endtp3:
  862.  
  863. .frame_tiles:
  864.     .byte    0x1C,0x0E,0x0E,0x0E,0x0E,0x0E,0x0E,0x0E,0x0E,0x0E,0x0E,0x0E,0x0E,0x0E,0x0E,0x0E,0x0E,0x0E,0x0E,0x1D
  865.     .byte    0x0F,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x0F
  866.     .byte    0x0F,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x0F
  867.     .byte    0x0F,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x0F
  868.     .byte    0x0F,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x0F
  869.     .byte    0x0F,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x0F
  870.     .byte    0x0F,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x0F
  871.     .byte    0x0F,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x0F
  872.     .byte    0x0F,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x0F
  873.     .byte    0x1E,0x0E,0x0E,0x0E,0x0E,0x0E,0x0E,0x0E,0x0E,0x0E,0x0E,0x0E,0x0E,0x0E,0x0E,0x0E,0x0E,0x0E,0x0E,0x1F
  874.  
  875. .kbdtable:
  876.     .ascii    | !"#$%&'()*+,-./|
  877.     .ascii    "0123456789:;<=>?"
  878.     .ascii    "@ABCDEFGHIJKLMNO"
  879.     .ascii    "PQRSTUVWXYZ[\\]^_"
  880.     .ascii    "`abcdefghijklmno"
  881.     .ascii    "pqrstuvwxyz{|}~ "
  882.